# Лекция: Selenide и PageObject

Selenide - это обертка вокруг Selenium WebDriver, которая упрощает написание автоматических тестов на Java.

## PageObject

PageObject - это шаблон проектирования, который используется в тестировании для создания объектов, представляющих веб-страницы или компоненты веб-страниц. Это помогает уменьшить дублирование кода и упростить поддержку тестов.

Пример класса PageObject для веб-страницы входа:

```java
import static com.codeborne.selenide.Selenide.$;

public class LoginPage {
    public void open() {
        Selenide.open("/login");
    }

    public void setUsername(String username) {
        $("#username").setValue(username);
    }

    public void setPassword(String password) {
        $("#password").setValue(password);
    }

    public void clickLogin() {
        $("#login").click();
    }
}
```

В этом примере `LoginPage` представляет веб-страницу входа и предоставляет методы для взаимодействия с элементами на этой странице.

## Использование PageObject в тестах

Тесты могут использовать объекты PageObject для взаимодействия с веб-страницами:

```java
import org.junit.jupiter.api.Test;

public class LoginTest {
    private LoginPage loginPage = new LoginPage();

    @Test
    public void testLogin() {
        loginPage.open();
        loginPage.setUsername("user");
        loginPage.setPassword("password");
        loginPage.clickLogin();
        // проверить, что вход успешный
    }
}
```

В этом примере `LoginTest` использует `LoginPage` для выполнения операций входа.

---

# Практические задания

1. **Создайте класс PageObject для веб-страницы входа.** (Сложность: 2/5)
```java
public class LoginPage {
    public void open() {
        Selenide.open("/login");
    }

    public void setUsername(String username) {
        $("#username").setValue(username);
    }

    public void setPassword(String password) {
        $("#password").setValue(password);
    }

    public void clickLogin() {
        $("#login").click();
    }
}
```

2. **Создайте тест, который использует PageObject для входа в систему.** (Сложность: 2/5)
```java
@Test
public void testLogin() {
    LoginPage loginPage = new LoginPage();
    loginPage.open();
    loginPage.setUsername("user");
    loginPage.setPassword("password");
    loginPage.clickLogin();
    // проверить, что вход успешный
}
```

3. **Создайте класс PageObject для веб-страницы профиля пользователя.** (Сложность: 2/5)
```java
public class UserProfilePage {
    public String getUsername() {
        return $("#username").getText();
    }

    public String getEmail() {
        return $("#email").getText();
    }
}
```

4. **Создайте тест, который использует PageObject для проверки информации профиля пользователя.** (Сложность: 3/5)
```java
@Test
public void testUserProfile() {
    LoginPage loginPage = new LoginPage();
    loginPage.open();
    loginPage.setUsername("user");
    loginPage.setPassword("password");
    loginPage.clickLogin();

    UserProfilePage userProfilePage = new UserProfilePage();
    assertEquals("user", userProfilePage.getUsername());
    assertEquals("user@example.com", userProfilePage.getEmail());
}
```

5. **Создайте класс PageObject для веб-страницы регистрации и тест, который использует этот PageObject для регистрации нового пользователя.** (Сложность: 3/5)
```java
public class RegistrationPage {
    public void open() {
        Selenide.open("/register");
    }

    public void setUsername(String username) {
        $("#username").setValue(username);
    }

    public void setEmail(String email) {
        $("#email").setValue(email);
    }

    public void setPassword(String password) {
        $("#password").setValue(password);
    }

    public void clickRegister() {
        $("#register").click();
    }
}

@Test
public void testRegistration() {
    RegistrationPage registrationPage = new RegistrationPage();
    registrationPage.open();
    registrationPage.setUsername("newuser");
    registrationPage.setEmail("newuser@example.com");
    registrationPage.setPassword("password");
    registrationPage.clickRegister();
    // проверить, что регистрация успешная
}
```

6. **Переделайте методы в классе страницы так, чтобы была возможность построить цепочку вызовов. Должно быть в итоге так:** (Сложность: 2/5)
```
@Test
public void testRegistration() {
RegistrationPage registrationPage = new RegistrationPage();
registrationPage
    .open();
    .setUsername("newuser");
    .setEmail("newuser@example.com");
    .setPassword("password");
    .clickRegister();
// проверить, что регистрация успешная
}
```
